Включаем компонент отвечающий за кэширование в Yii

Для того, чтобы начать использовать кэширование в Yii необходимо включить компонент кэширования, для этого откройте файл protected/config/main.php и в элемент components, массива добавьте следующие строки:

'cache'=>array( 
    'class'=>'system.caching.CDbCache'
)

Таким образом мы подключили CDbCache (это один из компонентов для работы с кэшированием Yii), он хранит данные кеширования в базе SQLite, что позволяет очень просто его настроить. С точки зрения производительности это не самый лучший выбор, но этот компонент все равно увеличит производительность нашего сайта.

Более мощным вариантом является использование компонента CApcCache, который использует APC.

Так как все компоненты кэша в Yii основаны на базовом классе фреймворка CCache, вы можете в любой момент поменять компонент кэширования в настройках (protected/config/main.php) не меняя при этом код вашего сайта.

Пример простого кэширования данных в Yii

Самый просто способ работы с кэшем в Yii это хранение его в переменных. Для этого компоненты кеширования Yii имеют два метода: get() и set().

Добавляем данные в кеш

Установим значение для кэширования, для этого будем использовать метод set(), который принимает 3 аргумента:

$id - уникальный идентификатор,

$value - значение, которое необходимо закэшировать,

$time - время жизни кэша переменной (в секундах, не обязательное значение).

Сохраним значение в кэш:

$value = "Очень важные данные, которые мы передаем в кэш";
$id    = "myData";
$time  = 60;
Yii::app()->cache->set($id, $value, $time);

Получаем значение из кэша

Для получения данных из кэша в Yii используется метод get(), который принимает 1 аргумент:

$id - уникальный идентификатор, который был задан при сохранении кэша. Получим данные из кэша:

Yii::app()->cache->get($id);

Если значение не было задано, то метод get() вернет false.

Удаляем значение из кэша

Для удаления значения из кэша в Yii используется метод delete(), который в качестве аргументов принимает уникальный идентификатор ($id) переменной, заданный при создании:

Yii::app()->cache->delete($id);

Для полного очищения кэша (удаление всех переменных) в Yii используется метод flush(), пример:

Yii::app()->cache->flush();

Кэширование запросов в Yii

Кэширование запросов очень важно, особенно для сайтов, которые используют сложные и высоконагружаемые запросы.

Для начала нам необходимо определить начальные зависимости запроса. Например, посчитаем количество пользователей на сайте:

SELECT MAX(id) FROM user

Таким образом мы можем проверить был ли добавлен новый пользователь по их количеству, если новых пользователей не появилось, то выводим список пользователей из кеша, если же появился новый пользователь, то выполняем запрос из БД и записываем его в кэш.

SELECT user.*, userData.city
FROM user
JOIN userData ON userData.id = user.userDataId

Yii, кэширование в построителе запросов

Для использования Query Caching в Query Builder используем следующую конструкция (основываясь на предыдущем примере):

//большой и сложный запрос
$query = 'SELECT user.*, userData.city
FROM user
JOIN userData ON userData.id = user.userDataId';
//зависимость $dependency = new CDbCacheDependency('SELECT MAX(id) FROM user');
//выполняем запрос $result = Yii::app()->db->cache(1000, $dependency)->createCommand($query)->queryAll();

Метод cache() получает 2 аргумента, 1-й - время хранения в секундах, 2-й - зависимость.

Как было описано выше. Yii проверит зависимость (количество пользователей), если она без изменений, то он возьмет данные из кэша, если зависимость изменилась, то Yii выполнит основной запрос и запишет его в кэш.

Yii, кеширование в Active Record

Так же, можно кэшировать результат запроса Active Record. Концепция остается такой же, как было рассмотрено выше, но синтаксис меняется:

$dependency = new CDbCacheDependency('SELECT MAX(id) FROM user');
$authors = User::model()->cache(1000, $dependency)->with('userData')->findAll();

Дополнительно

Кэширование это хороший инструмент повышения производительности вашего сайта (приложения). Однако не стоит забывать, что перед использованием кэширования необходимо максимально продумать структуры внедрения кеширования, иначе это может привести к неверному отображению данных.

Так же не стоит забывать, что компонент кэширования может иметь ограничение на хранимый объем данных.